package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.AfiliacionDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbClientePersona;
import com.pe.pgn.clubpgn.domain.ClpbEmpresaAfiliadora;
import com.pe.pgn.clubpgn.domain.ClpbEmpresaCelular;
import com.pe.pgn.clubpgn.domain.ClpbEstadoCivil;
import com.pe.pgn.clubpgn.domain.ClpbPrograma;
import com.pe.pgn.clubpgn.domain.ClpbTipoDocumentoPersona;
import com.pe.pgn.clubpgn.domain.ClpmUbigeo;
import com.pe.pgn.clubpgn.domain.ClprClientePrograma;
import com.pe.pgn.clubpgn.domain.beans.BNAfiliacion;
import com.pe.pgn.clubpgn.domain.beans.BNProgramaDetalle;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

/**
 * @author Frank
 * */

@SuppressWarnings({"rawtypes", "unchecked"})
@Repository("afiliacionDao")
public class AfiliacionDaoImpl extends GenericDaoHibernate<ClpbClientePersona, Long> implements AfiliacionDao{
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public AfiliacionDaoImpl() {
		super(ClpbClientePersona.class);
	}
	
	
	public List findEmpresasCelulares(boolean itemDefault) {
		
		Criteria criteria = DetachedCriteria.forClass(ClpbEmpresaCelular.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
		
		criteria.add(Restrictions.eq("stEmpresaCelular", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
	
		List listAll = new ArrayList();
		List<ClpbEmpresaCelular> lista = criteria.list();
		
		if(itemDefault){			
			ClpbEmpresaCelular obj = new ClpbEmpresaCelular();
			obj.setId(new Long("-1"));
			obj.setDeEmpresaCelular("----");
			listAll.add(obj);
		}
		
		listAll.addAll(lista);
		return listAll;
	}

	
	public List findEstadosCiviles() {
		
		Criteria criteria = DetachedCriteria.forClass(ClpbEstadoCivil.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
		
		criteria.add(Restrictions.eq("stEstadoCivil", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
	
		List<ClpbEstadoCivil> lista = criteria.list();
		return lista;
	}

	
	public List findTiposDocumentoPersona() {
		
		Criteria criteria = DetachedCriteria.forClass(ClpbTipoDocumentoPersona.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
		criteria.addOrder(Order.asc("id"));
	
		List<ClpbTipoDocumentoPersona> lista = criteria.list();
		return lista;
	}

	
	
	public List findUbigeos() {
		
		Criteria criteria = DetachedCriteria.forClass(ClpmUbigeo.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
	
		criteria.add(Restrictions.eq("stUbigeo", Boolean.TRUE));
		criteria.addOrder(Order.desc("id"));
	
		List<ClpmUbigeo> lista = criteria.list();
		return lista;	
	}

	public Map<String, Object> obtenerEmpresaAfiliadora(){
		return obtenerEmpresaAfiliadora(jdbcTemplate);
	}
	
	public List<BNProgramaDetalle> getListarProgramas() {

		StringBuffer query = new StringBuffer();
		query.append(" select id, ");
		query.append("   de_programa as descripcion ");
		query.append(" from clpb_programa  ");
		query.append(" 	where st_disponible_pto_afiliacion = '"+CLPConstantes.ST_VERDADERO+"'");
		
		Map<String, Object> empresa = obtenerEmpresaAfiliadora();
		if(empresa != null && empresa.get("coEmpresaAfiliadora") != null){
			BigDecimal coPrograma = (BigDecimal) empresa.get("coPrograma");
			query.append("		and id = ").append(coPrograma);
		}
	
		query.append("		and st_programa = '"+CLPConstantes.ST_VERDADERO+"'");
		return findListOfBeans(query.toString(), null, BNProgramaDetalle.class);
	}

	public List<BNProgramaDetalle> getListarProgramasxDefecto() {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	 id, ");
		query.append("   de_programa as descripcion, ");
		query.append("   st_afiliacion_por_defecto as stNoCompatible ");
		query.append(" from clpb_programa  ");
		query.append(" where st_disponible_pto_afiliacion = '"+CLPConstantes.ST_VERDADERO+"' ");
		
		Map<String, Object> empresa = obtenerEmpresaAfiliadora();
		if(empresa != null && empresa.get("coEmpresaAfiliadora") != null){
			BigDecimal coPrograma = (BigDecimal) empresa.get("coPrograma");
			query.append("		and id = ").append(coPrograma);
		}
		
		query.append(" and st_programa = '"+CLPConstantes.ST_VERDADERO+"' ");
		return findListOfBeans(query.toString(), null, BNProgramaDetalle.class);
	}

	
	public BNAfiliacion findClientePersonaPorCoDocumento(String coDocument,
			String codeTipoDoc) {

		BNAfiliacion afiliacion = new BNAfiliacion();
		
		try {
			
			StringBuffer query = new StringBuffer();
			query.append(" select");		
			query.append(" cp.id, ");
			query.append(" cp.co_codprov_celular 		as codProvCelular, ");
			query.append(" cp.co_celular 				as coCelular, ");
			query.append(" cp.co_code_numero_documento 	as coCodeNumeroDocumento, ");
			query.append(" cp.co_codprov_telefono 		as codProvTelefono, ");
			query.append(" cp.co_telefono_fijo 			as coTelefonoFijo, ");
			query.append(" cp.de_ape_materno 			as deApeMaterno, ");
			query.append(" cp.de_ape_paterno 			as deApePaterno, ");
			query.append(" cp.de_comentario_habilitado 	as deComentarioHabilitado, ");
			
			query.append(" cp.jr_direccion 				as jrDireccion, ");
			query.append(" cp.nombre_direccion 			as nombreDireccion, ");
			query.append(" cp.numero_direccion 			as numeroDireccion, ");
			query.append(" cp.mz_direccion 				as mzDireccion, ");
			query.append(" cp.dpto_direccion 			as dptoDireccion, ");
			query.append(" cp.nombre_urb_direccion 		as nombreUrbDireccion, ");
			query.append(" cp.sec_direccion 			as secDireccion, ");
			
			query.append(" cp.de_sexo 					as sexo, ");
			query.append(" cp.de_tienehijo 				as tienehijo, ");
			query.append(" cp.de_tieneauto 				as tieneauto, ");
			query.append(" cp.de_mail 					as deMail, ");
			query.append(" cp.de_nombre 				as deNombre, ");
			query.append(" cp.st_cliente_persona 		as stClienteActivo, ");
			query.append(" cp.st_habilitado 			as stTarjetaAsignada, ");
			query.append(" cp.co_empresa_celular 		as coEmpresaCelular, ");
			query.append(" ec.de_empresa_celular 		as deEmpresaCelular, ");
			query.append(" cp.co_estado_civil 			as coEstadoCivil, ");
			query.append(" sc.de_estado_civil 			as deEstadoCivil, ");
			query.append(" cp.co_tarjeta_persona 		as coTarjetaPersona_code, ");
			query.append(" tp.co_codigo_tarjeta_persona as coTarjetaPersona_text, ");
			query.append(" tp.co_codigo_tarjeta_persona as coTarjetaPersona_text_inicial, ");
			query.append(" cp.co_tipo_documento 		as coTipoDocumentoPersona, ");
			query.append(" td.de_tipo_documento_persona	as deTipoDocumentoPersona, ");
			query.append(" cp.co_ubigeo 				as coUbigeo,");
			query.append(" ub.co_departamento 			as coDepartamento, ");
			query.append(" ub.co_provincia 				as coProvincia, ");
			query.append(" ub.co_distrito 				as coDistrito, ");
			query.append(" ub.de_departamento 			as deDepartamento, ");
			query.append(" ub.de_provincia 				as deProvincia, ");
			query.append(" ea.de_empresa_afiliadora 	as deEmpresaAfiliadora,");
			query.append(" ea.id 						as coEmpresaAfiliadora, ");			
			query.append(" ub.de_distrito 				as deDistrito, ");
			query.append(" to_char(cast(cp.da_fecha_inscripcion as date), '"+CLPConstantes.FORMATO_FECHA_CLUB_PGN_BD+"') as desFechaInscripcion, ");
			query.append(" to_char(cast(cp.da_fecha_nacimiento  as date), '"+CLPConstantes.DATE_PATTERN+"') as desFechaNacimiento 	");
			
			query.append(" from clpb_cliente_persona cp ");
			query.append(" left join clpb_empresa_celular ec ");
			query.append(" 	on ec.id = cp.co_empresa_celular ");
			query.append(" left join clpb_estado_civil sc ");
			query.append(" 	on sc.id = cp.co_estado_civil ");
			query.append(" left join clpb_tarjeta_persona tp ");
			query.append(" 	on tp.id = cp.co_tarjeta_persona ");
			query.append(" left join clpb_tipo_documento_persona td ");
			query.append(" 	on td.id = cp.co_tipo_documento ");
			query.append(" left join clpm_ubigeo ub ");
			query.append(" 	on ub.id = cp.co_ubigeo ");
			query.append("		left join clpb_empresa_afiliadora ea on cp.co_empresa_afiliadora = ea.id ");
			query.append(" where 1 = 1 ");
			query.append(" 	and cp.co_code_numero_documento = '").append(coDocument).append("'");
			query.append(" 	and cp.co_tipo_documento  = ").append(codeTipoDoc);
			query.append(" 	and cp.st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			List list = findListOfBeans(query.toString(),null,BNAfiliacion.class);
			if(list != null && list.size() > 0){
				
				afiliacion = (BNAfiliacion)list.get(0);
				String desFechaInscripcion = afiliacion.getDesFechaInscripcion();
				String desFechaNacimiento  = afiliacion.getDesFechaNacimiento();
				String coEmpresaCelular    = afiliacion.getCoEmpresaCelular();
				String deEmpresaCelular    = afiliacion.getDeEmpresaCelular();
				String coEstadoCivil       = afiliacion.getCoEstadoCivil();
				String deEstadoCivil   	   = afiliacion.getDeEstadoCivil();
				String coUbigeo    		   = afiliacion.getCoUbigeo();
				String coTipoDocumentoPersona = afiliacion.getCoTipoDocumentoPersona();
				String deTipoDocumentoPersona = afiliacion.getDeTipoDocumentoPersona();
				
				
				if(ValidationUtil.isValidateString(desFechaInscripcion)){
					afiliacion.setDaFechaInscripcion(CalendarUtil.stringToCalendar
					(CLPConstantes.FORMATO_FECHA_CLUB_PGN,desFechaInscripcion));
				}
				
				if(ValidationUtil.isValidateString(desFechaNacimiento)){
					afiliacion.setDaFechaNacimiento(CalendarUtil.stringToCalendar
					(CLPConstantes.DATE_PATTERN,desFechaNacimiento));
				}
				
				if(ValidationUtil.isValidateString(coEmpresaCelular)){
					ClpbEmpresaCelular empresaCelular = new ClpbEmpresaCelular();
					empresaCelular.setId(new Long(coEmpresaCelular));
					empresaCelular.setDeEmpresaCelular(deEmpresaCelular);
					afiliacion.setClpbEmpresaCelular(empresaCelular);
				}
				
				if(ValidationUtil.isValidateString(coEstadoCivil)){
					ClpbEstadoCivil estadoCivil = new ClpbEstadoCivil();
					estadoCivil.setId(new Long(coEstadoCivil));
					estadoCivil.setDeEstadoCivil(deEstadoCivil);
					afiliacion.setClpbEstadoCivil(estadoCivil);
				}
				
				if(ValidationUtil.isValidateString(coTipoDocumentoPersona)){
					ClpbTipoDocumentoPersona tipoDocumento = new ClpbTipoDocumentoPersona();
					tipoDocumento.setId(new Long(coTipoDocumentoPersona));
					tipoDocumento.setDeTipoDocumentoPersona(deTipoDocumentoPersona);
					afiliacion.setClpbTipoDocumentoPersona(tipoDocumento);
				}
				
				if(ValidationUtil.isValidateString(coUbigeo)){
					ClpmUbigeo ubigeo = new ClpmUbigeo();
					ubigeo.setId(new Long(coUbigeo));
					afiliacion.setClpmUbigeo(ubigeo);
				}
				
				/**
				 * Lista de programas
				 * */
				
				afiliacion.setListaprograma(getListaProgramasByCoClientePersona(afiliacion));
			}
			
		}catch(Exception e){
			log.info(""+e.getMessage());
		}
		
		log.info("*** Cliente para Afiliacion encontrado: "+afiliacion.getId());
		return afiliacion;
	}
			
	private String getDescriptionTipoDocumentoByID(
		ClpbTipoDocumentoPersona tipoDocumento) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" de_tipo_documento_persona ");
		query.append(" from clpb_tipo_documento_persona ");
		query.append(" where id = ").append(tipoDocumento.getId());
		
		List list = findListOfMaps(query.toString(),null);
		if(list != null && list.size() > 0){
			
			Map objMap = (HashMap)list.get(0);
			return ""+objMap.get("de_tipo_documento_persona");
		}
		
		return "";
	}
	
	private List getListaProgramasByCoClientePersona(BNAfiliacion bean) {
	
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" clpb_programa as co_programa ");
			query.append(" from clpr_cliente_programa ");
			query.append(" where clpb_cliente_persona = ").append(bean.getId());
			
			Map<String, Object> empresa = obtenerEmpresaAfiliadora();
			if(empresa != null && empresa.get("coEmpresaAfiliadora") != null){
				BigDecimal coPrograma = (BigDecimal) empresa.get("coPrograma");
				query.append(" and clpb_programa = ").append(coPrograma);				
			}
			
			query.append(" and st_cliente_programa  = '"+CLPConstantes.ST_VERDADERO+"' ");
			
			String strPrograma = "";
			List list = findListOfMaps(query.toString(),null);
			if(list != null && list.size() > 0){
				for (int i = 0; i < list.size(); i++) {
				
					Map objMap = (HashMap)list.get(i);
					strPrograma = strPrograma + objMap.get("co_programa")+",";
					
					if(i == list.size()-1){
						strPrograma = strPrograma.substring(0,strPrograma.length()-1);
					}
				}			
			}
			
			if(strPrograma.equals("")){
				strPrograma = "-1";
			}
			
			query = new StringBuffer();
			query.append(" select id as id, ");
			query.append("	de_programa as descripcion,");
			query.append("	'Y' as stNoCompatible ");
			query.append(" from clpb_programa ");
			query.append(" where id in ("+strPrograma+")");
			query.append(" and st_disponible_pto_afiliacion = '"+CLPConstantes.ST_VERDADERO+"'");
			query.append(" and st_programa = '"+CLPConstantes.ST_VERDADERO+"'");
			List listBeanY = findListOfBeans(query.toString(), null, BNProgramaDetalle.class);
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	id as id, ");
			query.append("	de_programa as descripcion,");
			query.append("	'N' as stNoCompatible ");
			query.append(" from clpb_programa ");
			query.append(" where id not in ("+strPrograma+")");
			
			if(empresa != null && empresa.get("coEmpresaAfiliadora") != null){
				BigDecimal coPrograma = (BigDecimal) empresa.get("coPrograma");
				query.append(" and id = ").append(coPrograma);				
			}
			
			query.append(" and st_disponible_pto_afiliacion = '"+CLPConstantes.ST_VERDADERO+"'");
			query.append(" and st_programa = '"+CLPConstantes.ST_VERDADERO+"'");
			List listBeanN = findListOfBeans(query.toString(), null, BNProgramaDetalle.class);
			
			List listFinal = new ArrayList();
			listFinal.addAll(listBeanY);
			listFinal.addAll(listBeanN);
			return listFinal;
			
	}
	
	
	public Long getNumeroCaracteresByIdTipoDoc(Long idTipoDoc) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" va_numero_caracteres ");
		query.append(" from clpb_tipo_documento_persona");
		query.append(" where id = ").append(idTipoDoc);
		
		List list = jdbcTemplate.queryForList(query.toString());
		if(ValidationUtil.validateList(list)){
			
			Map obj = (HashMap)list.get(0);	
			BigDecimal big = (BigDecimal)obj.get("va_numero_caracteres");
			return Long.valueOf(big.longValue());
		}
		return null;
	}
	
	
	public HashMap getCoTarjetaPersonaInactivaByIDClientePersona(Long id) {

		StringBuffer query = new StringBuffer();
		query.append(" select distinct ");
		query.append(" 	cp.co_tarjeta_persona as co_tarjeta , ");
		query.append("	tp.co_codigo_tarjeta_persona as de_tarjeta,");
		query.append("	tp.da_fecha_modificacion, ");
		query.append("	tp.da_fecha_anulacion ");
		query.append(" from clpb_cliente_persona cp ");
		query.append(" 	join clpb_tarjeta_persona tp ");
		query.append(" 		on tp.id = cp.co_tarjeta_persona ");
		query.append(" where tp.co_cliente_persona = ").append(id);
		query.append(" and tp.st_tarjeta_persona = '").append(CLPConstantes.ST_FALSO).append("'");
		query.append(" order by tp.da_fecha_modificacion desc ");
		
		List list = findListOfMaps(query.toString(),null);
		if(list != null && list.size() > 0){
			
			return (HashMap)list.get(0);
		}
		
		return new HashMap();
	}
	
	public String isValidCodTarjetaPersona(String codigoTarjeta,
			Long coEstacion, Long coClientePersona, 
			boolean isValidateStatus, String deTarjetaAsig) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" id,co_estacion ");
		query.append(" from clpb_tarjeta_persona ");
		query.append(" where 1 = 1 ");
		
		if(isValidateStatus){
			query.append("	and st_tarjeta_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		}
		
		query.append(" 	and co_codigo_tarjeta_persona = '").append(codigoTarjeta).append("'");
		
		if(coClientePersona != null){
			query.append(" and (co_cliente_persona = ").append(coClientePersona);
			query.append(" or co_cliente_persona is null) ");
		}else{
			query.append(" and co_cliente_persona is null ");
		}
		
		List list = jdbcTemplate.queryForList(query.toString());
		if(ValidationUtil.validateList(list)){
			
			Map obj = (HashMap)list.get(0);
			String strID = String.valueOf(obj.get("id"));
			String strEstacion = String.valueOf(obj.get("co_estacion"));
			
			if(coClientePersona != null){
				
				if(deTarjetaAsig.equals(codigoTarjeta)){
					return strID;
				}else{ // en el caso que quiera asignar otra tarjeta diferente
					if(strEstacion.equals(coEstacion.toString())){
						return strID;
					}
				}				
			}else{ // en el caso de asignar por primera vez
				if(strEstacion.equals(coEstacion.toString())){
					return strID;
				}
			}			
		}		
		
		return "msg";
	}
	
	public boolean isValidCodNumeroDocClientePersona(
	String coCodeNumeroDocumento, Long idClientePersona) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" id ");
		query.append(" from clpb_cliente_persona ");
		query.append(" where 1 = 1 ");
		query.append(" 	and trim(co_code_numero_documento) = '").append(coCodeNumeroDocumento.trim()).append("'");
		query.append(" 	and st_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		if(idClientePersona != null){
			query.append(" and id  != ").append(idClientePersona);
		}
		
		List list = findListOfMaps(query.toString(),null);
		if(list != null && list.size() > 0){
			return false;			
		}else{
			return true;
		}	
	}
	
	public String isValidCoPrograma(String coPrograma,
	List<BNProgramaDetalle> listProgram) {

		StringBuffer query = null;
		for (BNProgramaDetalle bnDetalle : listProgram) {
			if(bnDetalle.isChkNoCompatible()){				
				if(!(""+bnDetalle.getId()).equals(coPrograma)){
			
					query = new StringBuffer();
					query.append(" select ");
					query.append(" 	n.id, p1.de_programa as de_programa,");
					query.append("	p2.de_programa as de_programa_no_compatible ");
					query.append(" from clpr_no_compatibilidad n ");
					query.append(" 	join clpb_programa p1 ");
					query.append(" 	on n.co_programa = p1.id ");
					query.append(" 	join clpb_programa p2 ");
					query.append(" 	on n.co_programa_no_compatible = p2.id ");
					query.append(" where n.st_nocompatibilidad = '"+CLPConstantes.ST_VERDADERO+"' ");
					query.append(" and n.co_programa = ").append(coPrograma);
					query.append(" and n.co_programa_no_compatible = ").append(bnDetalle.getId());
					
					List list = findListOfMaps(query.toString(),null);
					if(list != null && list.size() > 0){
						
						Map obj = (HashMap)list.get(0);
						return obj.get("de_programa")+" y "+obj.get("de_programa_no_compatible");			
					}
				}
			}			
		}

		return "";
	}

	
	public HashMap getCoTarjetaPersonaByIDClientePersona(Long id) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	cp.co_tarjeta_persona as co_tarjeta , tp.co_codigo_tarjeta_persona as de_tarjeta ");
		query.append(" from clpb_cliente_persona cp ");
		query.append(" 	join clpb_tarjeta_persona tp ");
		query.append(" 		on tp.id = cp.co_tarjeta_persona ");
		query.append(" where cp.id = ").append(id);
		query.append(" and tp.st_tarjeta_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		List list = findListOfMaps(query.toString(),null);
		if(list != null && list.size() > 0){
			
			return (HashMap)list.get(0);
		}
		
		return new HashMap();
	}

	
	public void updateActivoTarjetaPersona(String coTarjetaAsig) {
		
		StringBuffer query = new StringBuffer();
		query.append(" update ");		
		query.append(" clpb_tarjeta_persona ");
		query.append(" set ");
		query.append(" co_usuario_modificador	=	'"+getUsuarioLogueado().getUsername()+"', ");
		query.append(" da_fecha_modificacion	=	sysdate, ");
		query.append(" st_tarjeta_persona		=   '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" where id = ").append(coTarjetaAsig);
		jdbcTemplate.update(query.toString());
	}

	
	public void updateInactivoTarjetaPersona(String coTarjetaAsig, boolean setearFechaAnulacion) {
		
		StringBuffer query = new StringBuffer();
		query.append(" update ");		
		query.append(" clpb_tarjeta_persona ");
		query.append(" set ");
		query.append(" co_usuario_modificador	=	'"+getUsuarioLogueado().getUsername()+"', ");
		query.append(" da_fecha_modificacion	=	sysdate, ");
		
		if(setearFechaAnulacion){
			query.append(" da_fecha_anulacion	=	sysdate, ");
		}
		
		query.append(" st_tarjeta_persona		=   '").append(CLPConstantes.ST_FALSO).append("'");
		query.append(" where id = ").append(coTarjetaAsig);
		jdbcTemplate.update(query.toString());
	}
	
	public ClpbClientePersona setValuesOfBNAfiliacion(BNAfiliacion afiliacion){
	
		ClpbClientePersona bean = new ClpbClientePersona();
		bean.setId(afiliacion.getId());
		bean.setDeNombre(afiliacion.getDeNombre());
	    bean.setDeApePaterno(afiliacion.getDeApePaterno());
	    bean.setDeApeMaterno(afiliacion.getDeApeMaterno());
	    bean.setCoCodeNumeroDocumento(afiliacion.getCoCodeNumeroDocumento());
	    bean.setClpbTipoDocumentoPersona(afiliacion.getClpbTipoDocumentoPersona());
	    bean.setCoTelefonoFijo(afiliacion.getCoTelefonoFijo());
	    bean.setCoCelular(afiliacion.getCoCelular());
	    bean.setDeMail(afiliacion.getDeMail());
	    bean.setClpbTarjetaPersona(afiliacion.getClpbTarjetaPersona());
	    bean.setClpbEstadoCivil(afiliacion.getClpbEstadoCivil());
	    bean.setStClientePersona(afiliacion.isStClientePersona());
	    bean.setClpmUbigeo(afiliacion.getClpmUbigeo());
	    bean.setClpbEmpresaCelular(afiliacion.getClpbEmpresaCelular());
	    bean.setStHabilitado(afiliacion.isStHabilitado());
	    bean.setDeComentarioHabilitado(afiliacion.getDeComentarioHabilitado());
	    bean.setSexo(afiliacion.getSexo());
	    bean.setTieneauto(afiliacion.getTieneauto());
	    bean.setTienehijo(afiliacion.getTienehijo());
	    bean.setCodProvCelular(afiliacion.getCodProvCelular());
	    bean.setCodProvTelefono(afiliacion.getCodProvTelefono());
	    
	    bean.setJrDireccion(afiliacion.getJrDireccion());
	    bean.setNombreDireccion(afiliacion.getNombreDireccion());
	    bean.setNumeroDireccion(afiliacion.getNumeroDireccion());
	    bean.setMzDireccion(afiliacion.getMzDireccion());
	    bean.setDptoDireccion(afiliacion.getDptoDireccion());
	    bean.setNombreUrbDireccion(afiliacion.getNombreUrbDireccion());
	    bean.setSecDireccion(afiliacion.getSecDireccion());
	    
	    bean.setCoUsuarioCreador(afiliacion.getCoUsuarioCreador());
	    bean.setCoUsuarioModificador(afiliacion.getCoUsuarioModificador());        
	    bean.setDaFechaCreacion(afiliacion.getDaFechaCreacion());
	    bean.setDaFechaInscripcion(afiliacion.getDaFechaInscripcion());
	    bean.setDaFechaModificacion(afiliacion.getDaFechaModificacion());
	    bean.setDaFechaNacimiento(afiliacion.getDaFechaNacimiento());     
	    
	    Map<String, Object> empresa = obtenerEmpresaAfiliadora();
		if(empresa != null && empresa.get("coEmpresaAfiliadora") != null){
			BigDecimal coEmpresaAfiliadora = (BigDecimal) empresa.get("coEmpresaAfiliadora");
			ClpbEmpresaAfiliadora empresaAfiliadora = getHibernateTemplate().get(ClpbEmpresaAfiliadora.class,
					coEmpresaAfiliadora);
			bean.setClpbEmpresaAfiliadora(empresaAfiliadora);
		} else if(StringUtils.isNotBlank(afiliacion.getDeEmpresaAfiliadora())) {
			
			ClpbEmpresaAfiliadora empresaAfiliadora = 
				getHibernateTemplate().get(ClpbEmpresaAfiliadora.class, afiliacion.getCoEmpresaAfiliadora());
			bean.setClpbEmpresaAfiliadora(empresaAfiliadora);
		}
	    
	    return bean;
	}
	
	public void saveOrUpdateClientePersona(ClpbClientePersona clientePersona) {
	
		Long coEmpresaCelular = null;
		if(clientePersona.getClpbEmpresaCelular() != null){
			coEmpresaCelular = clientePersona.getClpbEmpresaCelular().getId();
		}
		
		Long coEstadoCivil    = clientePersona.getClpbEstadoCivil().getId();
		Long coTarjetaPersona = clientePersona.getClpbTarjetaPersona().getId();
		Long coTipoDoc 		  = clientePersona.getClpbTipoDocumentoPersona().getId();
		Long coUbigeo  		  = clientePersona.getClpmUbigeo().getId();
		
		if(coEmpresaCelular == null)
			clientePersona.setClpbEmpresaCelular(null);				
		if(coEstadoCivil == null)
			clientePersona.setClpbEstadoCivil(null);				
		if(coTarjetaPersona == null)
			clientePersona.setClpbTarjetaPersona(null);				
		if(coTipoDoc == null)
			clientePersona.setClpbTipoDocumentoPersona(null);				
		if(coUbigeo == null)
			clientePersona.setClpmUbigeo(null);
		
		/////////////////////////////////////////////////////////////
		if(clientePersona.getId() == null){
			
			clientePersona.setStClientePersona(true);
			clientePersona.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			clientePersona.setDaFechaCreacion(Calendar.getInstance());
			clientePersona.setDaFechaInscripcion(Calendar.getInstance());
		}
		else{
			
			clientePersona.setStClientePersona(true);
			clientePersona.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			clientePersona.setDaFechaModificacion(Calendar.getInstance());
		}

		getHibernateTemplate().saveOrUpdate(clientePersona);
		getHibernateTemplate().flush();
		/////////////////////////////////////////////////////////////
	}
	
	public void insertFirstTarjetaPersona(ClpbClientePersona bean) {
	
		StringBuffer query = new StringBuffer();
		query.append(" update ");		
		query.append(" clpb_tarjeta_persona ");
		query.append(" set ");
		query.append(" co_usuario_modificador	=	'"+getUsuarioLogueado().getUsername()+"', ");
		query.append(" da_fecha_modificacion	=	sysdate, ");
		query.append(" co_cliente_persona		=	"+bean.getId());
		query.append(" where id = ").append(bean.getClpbTarjetaPersona().getId());
		jdbcTemplate.update(query.toString());
	}
	
	public void insertClientePrograma(ClpbClientePersona bean, String coPrograma) {
	
	try{
		
		ClpbClientePersona clpbClientePersona = new ClpbClientePersona();
		clpbClientePersona.setId(bean.getId());
		
		ClpbPrograma clpbPrograma = new ClpbPrograma();
		clpbPrograma.setId(new Long(coPrograma));
		
		ClprClientePrograma clprClientePrograma = new ClprClientePrograma();
		clprClientePrograma.setStClientePrograma(true);
		clprClientePrograma.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
		clprClientePrograma.setDaFechaCreacion(Calendar.getInstance());
		clprClientePrograma.setClpbClientePersona(clpbClientePersona);
		clprClientePrograma.setClpbPrograma(clpbPrograma);
		
		getHibernateTemplate().saveOrUpdate(clprClientePrograma);
		getHibernateTemplate().flush();
			
		}catch(Exception e){
			log.info(" **** El insert a cliente programa salio mal !! -->"+e.getMessage());
		}
	}
	
	public void deleteProgramasByCoCliente(ClpbClientePersona bean) {
	
		StringBuffer query = new StringBuffer();
		query.append(" delete ");
		query.append(" from clpr_cliente_programa ");
		query.append(" where clpb_cliente_persona = "+bean.getId());
		
		jdbcTemplate.update(query.toString());
	}

	public List findDepartamentosUbigeo(boolean isItemDefault) {
	
		StringBuffer query = new StringBuffer();
		query.append(" select distinct   ");
		query.append(" 	co_departamento as coDepartamento, ");
		query.append(" 	de_departamento as deDepartamento  ");
		query.append(" from clpm_ubigeo ");
		query.append(" where 1 = 1 ");
		query.append(" and st_ubigeo = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" order by de_departamento asc ");
		
		List<ClpmUbigeo> listObj = new ArrayList<ClpmUbigeo>();
		List<ClpmUbigeo> lista   = findListOfBeans(query.toString(), null, ClpmUbigeo.class);
		
		if(isItemDefault){
			ClpmUbigeo bean = new ClpmUbigeo();
			bean.setCoDepartamento(new Integer("-1"));
			bean.setDeDepartamento("----");
			listObj.add(bean);
		}
		
		listObj.addAll(lista);
		return listObj;
	}

	public List findPronvinciaUbigeo(String coDepartamento, boolean isItemDefault) {

		List<ClpmUbigeo> listObj = new ArrayList<ClpmUbigeo>();
		
		if(isItemDefault){
			ClpmUbigeo bean = new ClpmUbigeo();
			bean.setCoProvincia(new Integer("-1"));
			bean.setDeProvincia("----");
			listObj.add(bean);
		}
		
		if(coDepartamento != null && !"".equals(coDepartamento)){
			
			StringBuffer query = new StringBuffer();
			query.append(" select distinct   ");
			query.append(" 	co_provincia as coProvincia, ");
			query.append(" 	de_provincia as deProvincia  ");
			query.append(" from clpm_ubigeo ");
			query.append(" where 1 = 1 ");
			query.append(" and co_departamento = ").append(coDepartamento);
			query.append(" and st_ubigeo = '"+CLPConstantes.ST_VERDADERO+"'");
			query.append(" order by de_provincia asc ");
			
			List<ClpmUbigeo> lista = findListOfBeans(query.toString(), null, ClpmUbigeo.class);
			listObj.addAll(lista);
		}
		
		return listObj;
	}
	
	public List findDistritoUbigeo(String coDepartamento, String coProvincia, boolean isItemDefault) {

		List<ClpmUbigeo> listObj = new ArrayList<ClpmUbigeo>();
		
		if(isItemDefault){
			ClpmUbigeo bean = new ClpmUbigeo();
			bean.setCoDistrito(new Integer("-1"));
			bean.setDeDistrito("----");
			listObj.add(bean);
		}
		
		if(coProvincia != null && !"".equals(coProvincia)){
			
			StringBuffer query = new StringBuffer();
			query.append(" select distinct   ");
			query.append(" 	co_distrito as coDistrito , ");
			query.append(" 	de_distrito as deDistrito   ");
			query.append(" from clpm_ubigeo ");
			query.append(" where 1 = 1 ");
			query.append(" and co_provincia = ").append(coProvincia);
			query.append(" and co_departamento = ").append(coDepartamento);
			query.append(" and st_ubigeo = '"+CLPConstantes.ST_VERDADERO+"'");
			query.append(" order by de_distrito asc ");
			
			List<ClpmUbigeo> lista = findListOfBeans(query.toString(), null, ClpmUbigeo.class);
			listObj.addAll(lista);
		}
		
		return listObj;
	}

	public ClpmUbigeo getUbigeo(String coDepartamento, String coProvincia,
			String coDistrito) {

		Criteria criteria = DetachedCriteria.forClass(ClpmUbigeo.class)
		.getExecutableCriteria(getSessionFactory().getCurrentSession());
		
		criteria.add(Restrictions.eq("coDepartamento", new Integer(coDepartamento)));
		criteria.add(Restrictions.eq("coProvincia"	 , new Integer(coProvincia)));
		criteria.add(Restrictions.eq("coDistrito"	 , new Integer(coDistrito)));
		criteria.add(Restrictions.eq("stUbigeo"		 , Boolean.TRUE));
	
		List<ClpmUbigeo> lista = criteria.list();
		if(!lista.isEmpty()){
			return (ClpmUbigeo)lista.get(0);
		}else{
			return null;
		}
		
	}

	public ClpbTipoDocumentoPersona getTipoDocumentoPersonaByID(
			String coTipoDocumentoPersona) {

		ClpbTipoDocumentoPersona tipoDocumento = new ClpbTipoDocumentoPersona();
		tipoDocumento.setId(new Long(coTipoDocumentoPersona));
		tipoDocumento.setDeTipoDocumentoPersona(getDescriptionTipoDocumentoByID(tipoDocumento));		
		return tipoDocumento;
	}

	public void updateClientePrograma(ClpbClientePersona bean,
			BNProgramaDetalle bnDetalle) {

		StringBuffer query = new StringBuffer();
		query.append(" update ");
		query.append(" clpr_cliente_programa set ");
		
		if(bnDetalle.isChkNoCompatible()){
			query.append(" st_cliente_programa	=	'"+CLPConstantes.ST_VERDADERO+"', ");
		}else{
			query.append(" st_cliente_programa	=	'"+CLPConstantes.ST_FALSO+"', ");
		}	
		query.append(" da_fecha_modificacion	=	sysdate ");
		query.append(" where clpb_cliente_persona = ").append(bean.getId());
		query.append(" 	 and clpb_programa = ").append(bnDetalle.getId());
		int rows = jdbcTemplate.update(query.toString());
		
		if(bnDetalle.isChkNoCompatible() && rows == 0){
			insertClientePrograma(bean,
			String.valueOf(bnDetalle.getId()));
		}
	}

	public int getNumCardsByUser(Long idCliente) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" count(*) ");
		query.append(" from clpb_tarjeta_persona ");
		query.append(" where co_cliente_persona = ").append(idCliente);
		return jdbcTemplate.queryForInt(query.toString());
	}
	
	public int verificarSiYaEsClientePorDocumento(String coNumeroDocumento){
		
		StringBuffer query = new StringBuffer();
		query.append(" select co_empresa_afiliadora as coEmpresaAfiliadora, ");
		query.append(" 		count(*) as contador   ");
		query.append(" from clpb_cliente_persona  ");
		query.append(" where co_code_numero_documento = ? ");
		query.append(" group by co_empresa_afiliadora ");
		
		List list = findListOfMaps(query.toString(), new Object[]{coNumeroDocumento});		
		if(list != null && !list.isEmpty()){
			
			Map<String, Object> map = (Map<String, Object>) list.get(0);
			BigDecimal coEmpresaAfiliadora = (BigDecimal)map.get("coEmpresaAfiliadora");
			
			Map<String, Object> empresa = obtenerEmpresaAfiliadora();
			BigDecimal coEmpresaAfiliadoraUsuario = (BigDecimal) empresa.get("coEmpresaAfiliadora");
				
			if(coEmpresaAfiliadora != null
					&& coEmpresaAfiliadora.equals(coEmpresaAfiliadoraUsuario)){
				
				return CLPConstantes.INDICADOR_CLIENTE_ES_DE_EMPRESA_AFILIADORA;
			} 
			return CLPConstantes.INDICADOR_CLIENTE_NO_ES_DE_EMPRESA_AFILIADORA;
		}
		return CLPConstantes.INDICADOR_NUEVO_CLIENTE;
	}
}
